7.03. Защита кода
Защита кода
Когда пишется код, он должен сохраняться в локальном файле в хранилище. Однако, никто из нас не защищён от непредвиденных ситуаций:
- Несохранённые изменения – допустим, работа велась без автосохранения, или IDE была закрыта случайно или из-за ошибки;
- Сбой системы – отключение электричества, синий экран смерти (BSOD), зависание операционной системы;
- Проблема с инфраструктурой – сбой сервера, проблема с диском;
- Перезапись файлов – случайное сохранение старой версии поверх новой (к примеру, случайно скопировали некорректный текст и сохранили файл).
- Удаление папок или файлов без возможности восстановления;
- Ошибочная замена файлов;
- Конфликт изменений из-за одновременной работы с файлом (когда разработчики №1 и №2 работали одновременно, будет сохранена версия последнего, без учёта первого).
Для защиты кода используется автосохранение (в первую очередь), снимки состояний, локальные истории и конечно же самое важное – VCS (version control system), система контроля версий.
*Контроль версий – процесс обеспечения учёта вносимых изменений с возможностью отмены изменений и отката к предыдущей версии.
Системы контроля версий — это программное обеспечение, которое помогает вам отслеживать изменения, которые вы вносите в свой код с течением времени. Когда вы редактируете свой код, вы говорите системе контроля версий сделать снимок ваших файлов. Система контроля версий сохраняет этот снимок навсегда, чтобы вы могли вызвать его позже, если он вам понадобится. Используйте контроль версий, чтобы сохранять свою работу и координировать изменения кода в вашей команде.
★ Самая популярная система контроля версий – Git (гит) – децентрализованная система контроля версий с распределенной архитектурой, позволяющая каждому разработчику обладать своей локальной копией всей истории разработки.

Git использует хеши SHA-1 (алгоритм криптографического шифрования), а с 2020 года перешел на SHA-256, хеш вычисляется от содержимого файла и от метаданных (размера, типа объекта). Технологии шифрования, которые используются для идентификации подлинности объектов, позволяют эффективно сравнивать хеш-таблицы файлов и обеспечивать контроль изменений.
Git используется через инструменты (можно назвать их Git-системами). Их можно разделить на два вида – платформы и клиенты.
Платформы позволяют использовать хостинг репозиториев. ★ GitLab – платформа для хостинга Git-репозиториев с расширенными возможностями (CI/CD, Issue Tracking, Wiki и прочее):
- можно установить на свой сервер и настроить под себя;
- встроенный CI/CD (устанавливается пайплайн);
- Issue Tracker (трекер задач);
- Container Registry (для Docker-образов). ★ GitHub – целая соцсеть, самый популярный хостинг Git-репозиториев, принадлежит Microsoft:
- встроенный CI/CD (GitHub Actions);
- Pull Requests (PR) – код-ревью перед слиянием;
- GitHub Pages (хостинг статических сайтов);
- Социальная сеть для разработчиков (именно там размещают open-source проекты). ★ Bitbucket – облачный сервис для хостинга репозиториев, созданный компанией Atlassian:
- ограниченная бесплатная версия (до 5 пользователей);
- интеграция с проектами Atlassian (Confluence (документация), Jira (привязка коммитов к задачам), Trello (управление задачами));
- Bitbucket Pipelines – CI/CD для автоматической сборки и деплоя;
- поддержка Mercurial – альтернативной системы контроля версий;
- Code Review и Pull Request.
Мы уже затрагивали историю развития системы контроля версий. На практике можно встретить некоторые из них, и даже устаревшие.
RCS — Revision Control System хранит историю по одному файлу, использует файлы с суффиксом «,v» (например, file.txt,v).
CVCS — Centralized Version Control Systems (Централизованные) это CVS, Subversion и Perforce. Все данные хранятся на сервере. Пользователь делает checkout → изменяет → commit. Нет локальной истории: если сервер сломается — теряется всё.
DVCS — Distributed Version Control Systems (Распределённые) не только Git. Есть ещё несколько.
Perforce (CVCS) - коммерческая система, широко используется в крупных компаниях (игровые студии, банки и т.д.), поддерживает большие бинарные файлы, отлично масштабируется, имеет мощный интерфейс и интеграции. Платная и сложная.
Mercurial (DVCS) более легкий, базирован на Python, является аналогом Git, но чуть проще. Подходит для маленьких и средних проектов, имеет меньше инструментов и интеграций.
Bazaar (DVCS) разработан Canonical (Ubuntu), поддерживает как децентрализованный, так и централизованный стиль работы. Может работать поверх других систем (Git, SVN), но сейчас мало кто его использует.
Darcs (DVCS) имеет оригинальный подход к отслеживанию изменений — оперирует патчами, а не коммитами. Почти не используется в промышленной разработке, имеет мало инструментов и плохую интеграцию, однако концепция у него интересная.
BitKeeper (DVCS) была одна из первых распределённых систем, быстрая, надёжная, использовалась для разработки Linux до появления Git. Но после появления Git практически вышла из употребления.
★ Клиенты позволяют взаимодействовать с платформами, и отличаются друг от друга графическим интерфейсом.
★ Командная строка (Git Bash, PowerShell) – самый гибкий способ работы с Git. Git устанавливается на компьютер, и интегрируется в командную строку, что позволяет выполнять операции путем ввода команд.
★ TortoiseGit – графический клиент Git для Windows, который интегрируется в проводник. В отличие от классического Git, изменения визуализируются. Для новичков – очень легко.
★ GitKraken – кроссплатформенный клиент с красивой визуализацией веток, с поддержкой GitHub/GitLab/Bitbucket.
★ SourceTree (от Atlassian) – бесплатный клиент с графическим интерфейсом, поддерживающий интеграцию с Jira и Bitbucket.
Авторизация в Git проходит весьма интересным образом.
PAT (Personal Access Token) представляет собой альтернативу паролю при работе с GitHub, GitLab и т.д., может иметь ограниченные права и срок действия, используется вместо пароля при HTTPS-подключении.
git clone https://github.com/username/repo.git
Username: ваш-логин
Password: ваш-PAT
Получить можно на GitHub: Settings → Developer settings → Personal access tokens

SSH-ключи - другой способ, подразумевающий асинхронное шифрование (публичный + приватный ключ), испольуемое при работе через SSH-протокол.
Создаются ключи, публичный ключ привязывается к аккаунту на GitHub/GitLab, и репозиторий клонируется через SSH:
git clone git@github.com:username/repo.git

Git Credential Manager (GCM) третий способ. Инструмент, который интегрируется в Git и сохраняет токены/PAT в Credential Manager.
Windows предоставляет систему управления учётными данными — Credential Manager (Диспетчер учетных данных).
Панель управления → Учетные записи пользователей → Диспетчер учетных данных
Там хранятся логины и пароли для веб-сайтов, сетевых ресурсов (UNC-пути), приложений, поддерживается Windows Hello, сертификаты, ключи и т.д.

Git использует именно этот механизм, когда вы включаете GCM.
Внутри Windows использует:
- LSA Secrets (Local Security Authority Secrets) - защищённая часть реестра, где хранятся локальные секреты;
- DPAPI (Data Protection API) для шифрования данных на уровне пользователя или машины, и Git использует именно это;
- CredMan (Credential Manager API) для работы с сохранёнными учетными данными - там хранятся логин и токены.